<?php

namespace Common\Model;

use Think\Model;

/**
 * 社区管理层：用户与社区管理委员会的关联模型
 */
class UserOrgModel extends Model {

    const SUPER_MANAGER = 1;     // 管理类型：主席
    const MANAGER = 2;           // 管理类型：理事

    const NORMAL = 0;           // 关联状态：正常
    const DELTEL = -1;          // 关联状态：卸任状态

    const USER_ORG_KEY = 'userorg:';    // 用户团体关系缓存键名
    const ORG_USER_KEY = 'orguser:';    // 团体用户关系缓存键名

    /**
     * 新增用户与社管关系数据
     * @param $uid
     * @param $bid
     * @param bool $super 为true表示主席，false表示理事
     * @return mixed
     */
    public static function addData($uid, $bid, $super = true){
        $data = [
            'uid' => $uid,
            'bid' => $bid,
            'create' => time(),
            'type' => $super ? self::SUPER_MANAGER : self::MANAGER
        ];
        if($id = M('UserOrg')->add($data)){
            self::clearUserOrgCache($uid);
            self::clearOrgUserCache($bid);
        }
        return $id;
    }

    /**
     * 更新用户与社管关系表数据
     * @param $uid
     * @param $bid
     * @param $data
     * @return bool
     */
    public static function updateUserOrg($uid, $bid, $data){
        if($result = M('UserOrg')->where(['uid' => $uid, 'bid' => $bid])->save($data)){
            self::clearUserOrgCache($uid);
            self::clearOrgUserCache($bid);
        }
        return $result;
    }

    /**
     * 获取用户管理的社区ID列表，如：[20,34,12,25]
     * @param $uid
     * @param $super mixed 为null表示所有，为true表示主席，false表示理事
     * @return array 如：[20,34,12,25]
     */
    public static function getUserOrgsId($uid, $super = null){
        $key = self::USER_ORG_KEY.$uid;
        $result = S($key);
        if(false === $result){
            $result = M('UserOrg')->where(['uid' => $uid, 'status' => self::NORMAL])->field('bid,type')->select();
            if(false !== $result){
                S($key, is_null($result) ? [] : $result);
            }
        }
        if(!$result){
            return null;
        }
        $arr = [];
        if(is_null($super)){
            foreach($result as $v){
                $arr[] = $v['bid'];
            }
        }else if($super){
            foreach($result as $v){
                if($v['type'] == self::SUPER_MANAGER){
                    $arr[] = $v['bid'];
                }
            }
        }else{
            foreach($result as $v){
                if($v['type'] == self::MANAGER){
                    $arr[] = $v['bid'];
                }
            }
        }
        return $arr;
    }

    /**
     * 获取社区的管理员ID列表，如：[20,34,12,25]
     * @param $bid
     * @param $super mixed 为null表示所有，为true表示主席，false表示理事
     * @return mixed
     */
    public static function getOrgUsersId($bid, $super = null){
        $key = self::ORG_USER_KEY.$bid;
        $result = S($key);
        if(false === $result){
            $result = M('UserOrg')->where(['bid' => $bid, 'status' => self::NORMAL])->field('uid,type')->select();
            if(false !== $result){
                S($key, is_null($result) ? [] : $result);
            }
        }
        if(!$result){
            return null;
        }
        $arr = [];
        if(is_null($super)){
            foreach($result as $v){
                $arr[] = $v['uid'];
            }
        }else if($super){
            foreach($result as $v){
                if($v['type'] == self::SUPER_MANAGER){
                    $arr[] = $v['uid'];
                }
            }
        }else{
            foreach($result as $v){
                if($v['type'] == self::MANAGER){
                    $arr[] = $v['uid'];
                }
            }
        }
        return $arr;
    }

    /**
     * 获取用户管理的社区信息[注意：不包括贡献度、关注数等信息]
     * @param      $uid
     * @param null $super 为null表示获取所有，为true表示获取超级管理员，为false表示一般管理员
     * @return array|null
     */
    public static function getUserOrgsInfo($uid, $super = null){
        $bids = self::getUserOrgsId($uid, $super);
        if(!$bids){
            return null;
        }
        $result = [];
        foreach ($bids as $v) {
            $result[] = BbsModel::getBbsById($v, false);
        }
        return $result;
    }

    /**
     * 获取团体的管理员信息
     * @param      $bid
     * @param null $super 为null表示获取所有，为true表示获取超级管理员，为false表示一般管理员
     * @return null
     */
    public static function getOrgUsersInfo($bid, $super = null){
        $uids = self::getOrgUsersId($bid, $super);
        if(!$uids){
            return null;
        }
        $result = [];
        foreach ($uids as $v) {
            $result[] = UserModel::getUserById($v, false);
        }
        return $result;
    }

    /**
     * 检测用户是否是社区管理员
     * @param $uid
     * @param $bid
     * @param null $super 为null表示所有，为true表示主席，false表示理事
     * @return bool
     */
    public static function checkManager($uid, $bid, $super = null){
        $managerArr = self::getUserOrgsId($uid, $super);
        return $managerArr ? in_array($bid, $managerArr) : false;
    }

    /**
     * 检测用户是否是唯一主席
     * @param $uid
     * @param $bid
     * @return bool
     */
    public static function checkOnlySuper($uid, $bid){
        $managerArr = self::getOrgUsersId($bid, true);
        return count($managerArr) === 1 ? $uid === $managerArr[0] : false;
    }

    public static function clearUserOrgCache($uid){
        $key = self::USER_ORG_KEY.$uid;
        S($key, null);
    }

    public static function clearOrgUserCache($bid){
        $key = self::ORG_USER_KEY.$bid;
        S($key, null);
    }

}